package com.bluedot.www.framework.mvc.utils;

import org.dom4j.*;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 扫描service.xml文件：
 * 1. 得到所有的类名，然后实例化
 * 2. 得到所有的方法和url的对应关系
 * 3. 根据url和方法参数对应关系
 *
 * @author He Peng
 * @version 1.0
 * @date 2021/8/13 10:50
 */
public class XmlUtil {
    /**
     * URL 和 MethodName 的对应关系，使用ClassName作为父目录区分
     */
    private static final Map<String, Map<String, String>> URL_METHOD_MAPPING = new HashMap<>();


    public XmlUtil(String location) {
        parse(location);
    }

    public static Map<String, Map<String, String>> getUrlMethodMapping() {
        return URL_METHOD_MAPPING;
    }

    private void parse(String location) {
        Map<String, String> mapping = new HashMap<>();

        //创建一个内存对象Document，它就表示硬盘中的xml文件

        Document xmlDocument = DocumentHelper.createDocument();
        //将内存中的对象Document写入硬盘，形成一个xml文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(location);
        //创建dom4j核心解析器
        SAXReader saxReader = new SAXReader();
        //读取xml文件
        Document xml = null;
        try {
            xml = saxReader.read(inputStream);
            if (xml == null) {
                throw new RuntimeException(location + " xml读取异常");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        Element rootElement = xml.getRootElement();

        List<Element> serviceElements = rootElement.elements("service");
        // 遍历xml文件节点，获取数据
        for (Element service : serviceElements) {
            Attribute attribute = service.attribute("class");
            Attribute baseUrl = service.attribute("baseUrl");

            List<Element> methods = service.elements("method");
            for (Element method : methods) {
                Attribute name = method.attribute("name");
                Attribute url = method.attribute("url");
                mapping.put(name.getText(), baseUrl.getText() + "/" + url.getText());
            }
            // 克隆Map
            Map<String, String> tmp = new HashMap<>(16);
            tmp.putAll(mapping);
            URL_METHOD_MAPPING.put(attribute.getText(), tmp);
            mapping.clear();
        }
    }
}
